有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在spring boot中部分回滚数据,错误将被分散

我在事务中创建了表数据的序列,使用如下所示的springbootjavajpahibernate序列。使用的数据库是Oracle

  1. 下订单-插入订单明细表
  2. 处理付款-插入付款信息表
  3. 错误消息(信息、警告、错误)-插入错误消息表

如果发生任何错误(信息、警告、错误),我将在error_message表中插入错误消息
如果在处理请求的过程中没有发生错误,我的信息和警告消息将被保存到error_message。 但是如果有错误,我会从代码中抛出一个错误,以回滚transaction,它可以工作,但我的error_message也会回滚

我想要回滚details_tablepayment_info,但不是error_message,我想要它们被持久化

我怎样才能达到同样的效果


共 (1) 个答案

  1. # 1 楼答案

    使用两个不同的事务

    默认的事务传播是REQUIRED,当在没有事务上下文的情况下调用@Transactional注释的方法时,将启动一个新的事务,但如果已经有一个事务,则该事务将被加入,最终以单个事务结束。在回滚的情况下,所有操作都将被回滚,因为它们属于同一事务

    将事务传播更改为REQUIRES_NEW,以便始终强制启动新事务(而不是在有新事务时加入)。这将允许您独立于支付信息提交错误消息交易

    @Transactional
    public void placeOrder(Order oder) {
      // process order
      
      paymentGateway.processPayment();
    
      // save order <- an exception here will rollback the current 
      // transaction but not the one in PaymentGateway which is independent
    } 
    
    // In PaymentGateway
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void processPayment() {
      // process payment
      // insert error messages
    }
    
    

    进一步阅读:Understanding PROPAGATION_REQUIRED。确保您还了解异常如何影响事务